#!/bin/bash

# ==========================================
# H3C Server API 启动脚本
# 功能：启动 H3C Server API 服务
# ==========================================

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 配置变量
PROJECT_NAME="h3c-server-api"
CONTAINER_NAME="${PROJECT_NAME}"
IMAGE_NAME="${PROJECT_NAME}:latest"
CONFIG_FILE="./config/config.yaml"
DATA_DIR="./data"
LOG_FILE="./logs/${PROJECT_NAME}.log"
PORT="${PORT:-8080}"
RESTART_POLICY="${RESTART_POLICY:-unless-stopped}"

# 打印函数
print_message() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_step() {
    echo -e "\n${BLUE}========== $1 ==========${NC}"
}

# 显示使用帮助
show_help() {
    echo "使用方法: ./start.sh [选项]"
    echo ""
    echo "选项:"
    echo "  start         启动服务（默认）"
    echo "  stop          停止服务"
    echo "  restart       重启服务"
    echo "  status        查看服务状态"
    echo "  logs          查看服务日志"
    echo "  -h, --help    显示帮助信息"
    echo ""
    echo "环境变量:"
    echo "  PORT          服务端口（默认: 8080）"
    echo "  RESTART_POLICY 重启策略（默认: unless-stopped）"
    echo ""
    echo "示例:"
    echo "  ./start.sh              # 启动服务"
    echo "  ./start.sh stop         # 停止服务"
    echo "  ./start.sh restart      # 重启服务"
    echo "  PORT=8081 ./start.sh    # 在8081端口启动"
}

# 检查 Docker
check_docker() {
    if ! command -v docker &> /dev/null; then
        print_error "Docker 未安装，请先安装 Docker"
        exit 1
    fi
    
    # 检查 Docker 服务是否运行
    if ! docker info > /dev/null 2>&1; then
        print_error "Docker 服务未运行，请启动 Docker 服务"
        exit 1
    fi
}

# 检查镜像
check_image() {
    if ! docker images | grep -q "$PROJECT_NAME"; then
        print_error "Docker 镜像 $IMAGE_NAME 不存在"
        print_message "请先运行安装脚本或手动加载镜像"
        exit 1
    fi
}

# 检查配置文件
check_config() {
    if [ ! -f "$CONFIG_FILE" ]; then
        print_warning "配置文件不存在: $CONFIG_FILE"
        
        # 如果存在示例配置文件，复制一份
        if [ -f "./config/config.example.yaml" ]; then
            print_message "复制示例配置文件..."
            cp ./config/config.example.yaml "$CONFIG_FILE"
            print_warning "已创建默认配置文件，请根据需要修改: $CONFIG_FILE"
        else
            print_error "找不到配置文件，请创建: $CONFIG_FILE"
            exit 1
        fi
    fi
    
    # 检查prompts.yaml配置文件
    # 程序支持从 config/prompts.yaml 或 ./prompts.yaml 读取
    if [ ! -f "./config/prompts.yaml" ] && [ ! -f "./prompts.yaml" ]; then
        print_warning "prompts.yaml 配置文件不存在"
        
        # 如果存在示例配置文件，复制到config目录
        if [ -f "./config/prompts.example.yaml" ]; then
            print_message "复制prompts示例配置文件..."
            cp ./config/prompts.example.yaml ./config/prompts.yaml
            print_message "已创建prompts配置文件: ./config/prompts.yaml"
        else
            print_warning "将使用程序内置的默认prompt配置"
        fi
    elif [ -f "./config/prompts.yaml" ]; then
        print_message "使用prompts配置: ./config/prompts.yaml"
    elif [ -f "./prompts.yaml" ]; then
        print_message "使用prompts配置: ./prompts.yaml"
    fi
}

# 创建必要的目录
create_directories() {
    # 创建数据目录
    if [ ! -d "$DATA_DIR" ]; then
        print_message "创建数据目录: $DATA_DIR"
        mkdir -p "$DATA_DIR/uploads/documents"
    fi
    
    # 创建日志目录
    LOG_DIR=$(dirname "$LOG_FILE")
    if [ ! -d "$LOG_DIR" ]; then
        print_message "创建日志目录: $LOG_DIR"
        mkdir -p "$LOG_DIR"
    fi
}

# 检查端口占用
check_port() {
    if lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null 2>&1; then
        print_error "端口 $PORT 已被占用"
        print_message "请更换端口或停止占用该端口的服务"
        exit 1
    fi
}

# 启动服务
start_service() {
    print_step "启动 H3C Server API 服务"
    
    # 检查是否已有容器在运行
    if docker ps | grep -q "$CONTAINER_NAME"; then
        print_warning "服务已在运行中"
        docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
        return 0
    fi
    
    # 检查是否有停止的容器
    if docker ps -a | grep -q "$CONTAINER_NAME"; then
        print_message "发现已停止的容器，正在删除..."
        docker rm "$CONTAINER_NAME" > /dev/null 2>&1
    fi
    
    # 检查端口
    check_port
    
    # 启动容器
    print_message "正在启动服务..."
    
    # 构建挂载参数
    MOUNT_PARAMS="-v $(pwd)/$CONFIG_FILE:/app/config.yaml:ro"
    MOUNT_PARAMS="$MOUNT_PARAMS -v $(pwd)/$DATA_DIR:/app/data"
    
    # 挂载prompts.yaml（优先使用config目录下的）
    if [ -f "./config/prompts.yaml" ]; then
        MOUNT_PARAMS="$MOUNT_PARAMS -v $(pwd)/config/prompts.yaml:/app/config/prompts.yaml:ro"
    elif [ -f "./prompts.yaml" ]; then
        MOUNT_PARAMS="$MOUNT_PARAMS -v $(pwd)/prompts.yaml:/app/prompts.yaml:ro"
    fi
    
    # 如果有config目录，整个挂载（方便其他配置文件）
    if [ -d "./config" ]; then
        MOUNT_PARAMS="$MOUNT_PARAMS -v $(pwd)/config:/app/config:ro"
    fi
    
    docker run -d \
        --name "$CONTAINER_NAME" \
        -p "${PORT}:8080" \
        $MOUNT_PARAMS \
        -e TZ=Asia/Shanghai \
        --restart "$RESTART_POLICY" \
        "$IMAGE_NAME" > /dev/null 2>&1
    
    # 等待服务启动
    print_message "等待服务启动..."
    sleep 3
    
    # 检查服务状态
    if docker ps | grep -q "$CONTAINER_NAME"; then
        print_message "✓ 服务启动成功！"
        echo ""
        echo "服务信息："
        echo "  - 容器名称: $CONTAINER_NAME"
        echo "  - 访问地址: http://localhost:${PORT}"
        echo "  - API 文档: http://localhost:${PORT}/swagger/index.html"
        echo "  - 健康检查: http://localhost:${PORT}/health"
        echo ""
        echo "查看日志: docker logs -f $CONTAINER_NAME"
    else
        print_error "服务启动失败"
        echo "查看错误信息: docker logs $CONTAINER_NAME"
        exit 1
    fi
}

# 停止服务
stop_service() {
    print_step "停止 H3C Server API 服务"
    
    if docker ps | grep -q "$CONTAINER_NAME"; then
        print_message "正在停止服务..."
        docker stop "$CONTAINER_NAME" > /dev/null 2>&1
        docker rm "$CONTAINER_NAME" > /dev/null 2>&1
        print_message "✓ 服务已停止"
    else
        print_warning "服务未运行"
    fi
}

# 重启服务
restart_service() {
    print_step "重启 H3C Server API 服务"
    stop_service
    sleep 2
    start_service
}

# 查看服务状态
check_status() {
    print_step "服务状态"
    
    if docker ps | grep -q "$CONTAINER_NAME"; then
        print_message "✓ 服务运行中"
        echo ""
        docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
        
        # 显示资源使用情况
        echo ""
        echo "资源使用："
        docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}" "$CONTAINER_NAME"
        
        # 健康检查
        echo ""
        echo "健康检查："
        if curl -s -o /dev/null -w "%{http_code}" "http://localhost:${PORT}/health" | grep -q "200"; then
            print_message "✓ 服务健康"
        else
            print_warning "健康检查失败"
        fi
    else
        print_warning "服务未运行"
        
        # 检查是否有停止的容器
        if docker ps -a | grep -q "$CONTAINER_NAME"; then
            echo ""
            echo "停止的容器："
            docker ps -a --filter "name=$CONTAINER_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.CreatedAt}}"
        fi
    fi
}

# 查看日志
show_logs() {
    print_step "服务日志"
    
    if docker ps -a | grep -q "$CONTAINER_NAME"; then
        docker logs -f "$CONTAINER_NAME"
    else
        print_error "容器不存在"
        exit 1
    fi
}

# 使用 docker-compose 启动（如果存在）
start_with_compose() {
    if [ -f "docker-compose.yml" ] && command -v docker-compose &> /dev/null; then
        print_step "使用 docker-compose 启动服务"
        
        read -p "检测到 docker-compose.yml，是否使用 docker-compose 启动？(y/N) " -n 1 -r
        echo
        if [[ $REPLY =~ ^[Yy]$ ]]; then
            docker-compose up -d
            print_message "✓ 服务已通过 docker-compose 启动"
            docker-compose ps
            return 0
        fi
    fi
    return 1
}

# 主函数
main() {
    # 检查基础环境
    check_docker
    
    # 根据参数执行相应操作
    case "$1" in
        stop)
            stop_service
            ;;
        restart)
            restart_service
            ;;
        status)
            check_status
            ;;
        logs)
            show_logs
            ;;
        -h|--help|help)
            show_help
            ;;
        start|"")
            # 检查环境
            check_image
            check_config
            create_directories
            
            # 尝试使用 docker-compose
            if ! start_with_compose; then
                # 使用 docker run 启动
                start_service
            fi
            ;;
        *)
            print_error "无效的选项: $1"
            echo ""
            show_help
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"
